package com.atguigu.bigdata.scala.chapter06

import java.util.{HashMap => JavaHashMap}

object Scala04_Object_Import {
    def main(args: Array[String]): Unit = {

        // TODO 面向对象编程 - import
        /*
          TODO java 中import的作用
          1. 导入指定包中的类
          2. 静态导入：导入类中静态属性或方法

          注意的地方：
          1. 为了方便导入，可以将一个包中的多个类简化为通配符:*
             import java.util.*;
             这种导入的方式仅仅是为了开发方便，并不会将指定包中的类全部加载

          2. 默认情况下，java.lang这个包是不需要导入，因为默认已经导入过了。

          问题：
          1. 用起来不方便, 不直观
          new Date()

          2. 有的时候，需要导入大量的类，让程序的可读性变差

          java中的import语法的功能比较单一，那么scala对语法进行扩展，提供更多的功能
         */

        // TODO scala 中import的作用
        // 1. java中采用星号作为通配符，scala中采用下划线表示通配符
        // import java.util._

        // 2. import关键字可以声明在任意的地方
        //import java.util.Date
        //new Date()

        // 3. scala中import不仅仅导入类，也可以导包
        //    scala中包也可以用对象的概念，所以可以导入的
        //import java.util
        //new util.Date()

        // 4. scala中可以导入对象,这个对象变量必须采用val声明,不能采用var声明
        //val user = new User()
        //import user._
        //testUser()

        // 5. scala中也存在默认导入的概念
        //    默认导入的有 :
        //    import Predef._
        //    import java.lang._
        //    import scala._
        //println("zhangsan")

        // 6. 屏蔽类
        //import java.util._
        //import java.sql.{Date=>_, _}
        //println(new Date())

        // 7. 可以在一行代码中导入相同包中的多个类
        //import java.util.{List, ArrayList, Map}

        // 8. 能不能自己声明一个包：java.util?
        //    能不能自己声明一个类：HashMap?
        //    scala中默认导入类是以相对包路径进行导入，当前的包就是基准路径
        //        如果在当前包下查找不到指定的包，那么会从根路径（顶层包结构）查找
        //    如果不想依赖于相对路径，而是想要绝对路径，那么需要采用特殊的语法
        println(new _root_.java.util.HashMap())
        println(new java.util.HashMap())

        // 9. 给类起别名，使用起来方便
        // import java.util.{HashMap=>JavaHashMap}
//        new JavaHashMap()

        // java.lang.String(Me)
        // java.lang.String(JDK)
        // 如果当前环境中，有两个一摸一样的类，就需要考虑哪个类起作用的问题。
        // 这里和类加载器有关
        // 默认情况下，JDK有3个类加载器，加载不同环境的类
        // 如果在当前环境中有相同的类，那么类加载器会采用：双亲委派机制进行加载
    }

    class User {
        def testUser(): Unit = {
            println("test user...")
        }
    }
}
package java {
    package util {
        class HashMap() {

        }
    }
}
